package com.demo.java.OD251_300.OD258;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.PriorityQueue;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【查找舆情热词 or 热词排序】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146054983
 */
public class OdMain {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        LinkedHashMap<String, int[]> map = new LinkedHashMap<>();
        String line;

        // 读取topN和M
        while ((line = br.readLine()) != null) {
            String[] parts = line.split(" ");
            int N = Integer.parseInt(parts[0]);
            int M = Integer.parseInt(parts[1]);

            // 处理每篇文章
            for (int i = 0; i < M; i++) {
                String[] title = br.readLine().split(" ");
                String[] paper = br.readLine().split(" ");

                // 处理标题词，赋予3倍权重
                for (String s : title) {
                    int[] arr = map.getOrDefault(s, new int[]{0, 0, 0});
                    arr[0] = i;  // 标记标题词
                    arr[1]++;    // 增加频次
                    map.put(s, arr);
                }

                // 处理正文词，赋予1倍权重
                for (String s : paper) {
                    int[] arr = map.getOrDefault(s, new int[]{0, 0, 0});
                    arr[0] = -1; // 标记正文词
                    arr[2]++;    // 增加频次
                    map.put(s, arr);
                }
            }

            // 利用优先队列进行排序
            PriorityQueue<Map.Entry<String, int[]>> pq = new PriorityQueue<>((o1, o2) -> {
                int[] arr1 = o1.getValue();
                int[] arr2 = o2.getValue();
                int v1 = arr1[1] * 3 + arr1[2]; // 计算总权重
                int v2 = arr2[1] * 3 + arr2[2]; // 计算总权重
                if (v1 != v2) {
                    return Integer.compare(v2, v1); // 按权重比较
                }
                return o1.getKey().compareTo(o2.getKey()); // 按字典顺序比较
            });

            // 将所有词添加到优先队列
            pq.addAll(map.entrySet());
            StringBuilder sb = new StringBuilder();

            // 输出前N个单词
            for (int i = 0; i < N; i++) {
                sb.append(pq.poll().getKey()).append(" ");
            }
            System.out.println(sb.toString().trim());
            map.clear(); // 清空map，为下次测试准备
        }
    }
}